class Solution {
public:
    bool check(int *num1,int*num2)
    {
        for(int i=0;i<26;i++)
        {
            if(num1[i]!=num2[i]) return false;
        }
        return true;
    }
    vector<int> findAnagrams(string s, string p) {
        vector<int>ret;
        int hash1[26]={0};
        int hash2[26]={0};
        for(auto&ch:p) hash1[ch-'a']++;
        for(int left=0,right=0;right<s.size();right++)
        {
            //进窗口
            hash2[s[right]-'a']++;
            //判断出窗口此时不用循环了因为我们出窗口此时我们只移动一次
            if(right-left+1>p.size())
            {
                hash2[s[left++]-'a']--;
            }
            //此时判断哈希表是否一致 一致的话一定是结果 
            if(check(hash1,hash2))
            {
                ret.push_back(left);
            }
        }
        return ret;
    }
};

//优化做法统计我们的p中字符出现的个数hash1 维护一个变量记录窗口中有效字符的个数
//判断是不是有效字符 看一下hash2[字符]<=hash1[字符] 此时count++；反之不变
//出窗口：right-left+1大于p的长度 出窗口之前要判断此时出的字符是不是有效字符
class Solution {
public:
    
    vector<int> findAnagrams(string s, string p) {
        vector<int>ret;
        int hash1[26]={0};
        int hash2[26]={0};
        for(auto&ch:p) hash1[ch-'a']++;
        int count=0;
        for(int left=0,right=0;right<s.size();right++)
        {
            //进窗口
            hash2[s[right]-'a']++;
            if(hash2[s[right]-'a']<=hash1[s[right]-'a'])
            {
                count++;
            }
            if(right-left+1>p.size())
            {
                if(hash2[s[left]-'a']<=hash1[s[left]-'a'])
                {
                    count--;
                }
                hash2[s[left]-'a']--;
                left++;
            }
            if(count==p.size())
            {
                ret.push_back(left);
            }
           
        }
        return ret;
    }
};